SPB Git forge

spb/hilmacorp

Public
1commits 1branches 0releases
29.2 MBsize
maindefault branch
20 days agolast push
TypeScript 93.3% JavaScript 4.4% CSS 2.3%
2.9 KB · 105 lines tsx
Raw Blame History
1/**2 * Author: Simon-Pierre Boucher3 * Contact: contact@spboucher.ai4 * Project: Hilmacorp.ai — Web Platform5 * File: app/[locale]/founders/page.tsx6 * Description: Founders page — profiles of Simon-Pierre Boucher and Massamba Mbaye7 */89import type { Metadata } from "next";10import Container from "@/components/Container";11import SectionHeading from "@/components/SectionHeading";12import { getMessages, isLocale, type Locale } from "@/lib/i18n";1314export async function generateMetadata({15  params,16}: {17  params: Promise<{ locale: string }>;18}): Promise<Metadata> {19  const { locale } = await params;20  if (!isLocale(locale)) return {};21  const { meta } = getMessages(locale);22  return { title: { absolute: meta.founders.title }, description: meta.founders.description };23}2425function FounderCard({26  name,27  role,28  bio,29  tags,30  initials,31}: {32  name: string;33  role: string;34  bio: string;35  tags: string[];36  initials: string;37}) {38  return (39    <article className="rounded-3xl border border-line bg-card p-8 shadow-sm sm:p-10">40      <div className="flex items-center gap-5">41        <span42          aria-hidden="true"43          className="flex h-16 w-16 shrink-0 items-center justify-center rounded-2xl bg-ink font-mono text-lg font-semibold text-paper"44        >45          {initials}46        </span>47        <div>48          <h2 className="font-display text-2xl font-semibold text-ink">{name}</h2>49          <p className="mt-1 text-sm font-medium text-accent">{role}</p>50        </div>51      </div>52      <p className="mt-6 leading-relaxed text-ink-soft">{bio}</p>53      <ul className="mt-6 flex flex-wrap gap-2">54        {tags.map((tag) => (55          <li56            key={tag}57            className="rounded-full bg-accent-soft px-3 py-1 text-xs font-medium text-accent-strong"58          >59            {tag}60          </li>61        ))}62      </ul>63    </article>64  );65}6667export default async function FoundersPage({68  params,69}: {70  params: Promise<{ locale: string }>;71}) {72  const { locale } = await params;73  const { founders } = getMessages(locale as Locale);7475  return (76    <>77      <section className="relative overflow-hidden border-b border-line">78        <div className="grid-backdrop absolute inset-0" aria-hidden="true" />79        <Container className="relative py-20 sm:py-28">80          <SectionHeading as="h1" title={founders.title} lead={founders.lead} />81        </Container>82      </section>8384      <section className="py-20 sm:py-24">85        <Container className="grid gap-8 lg:grid-cols-2">86          <FounderCard87            name={founders.spb.name}88            role={founders.spb.role}89            bio={founders.spb.bio}90            tags={founders.spb.tags}91            initials="SPB"92          />93          <FounderCard94            name={founders.mm.name}95            role={founders.mm.role}96            bio={founders.mm.bio}97            tags={founders.mm.tags}98            initials="MM"99          />100        </Container>101      </section>102    </>103  );104}105